﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorAssembly.h
 * @brief  Abaqus Assembly 适配器 用于读取INP过程中的Assembly解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-19
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTORASSEMBLY__H__
#define __FITKABAQUSADAPTORASSEMBLY__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKModelSet)
ForwardDeclarNS(Interface, FITKMeshSurface)

namespace IO
{
    /**
     * @brief Abaqus Assembly 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-15
     */
    class FITKAbaqusAdaptorAssembly : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorAssembly() = default;
        ~FITKAbaqusAdaptorAssembly() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool adaptW() override;

    private:

        /**
         * @brief 读取实例
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readInstance();

        /**
         * @brief 读取点
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readNode();

        /**
         * @brief 读取点、单元的集合
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readSet();

        /**
         * @brief 读取模型中的表面或区域
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readSurface();

        /**
         * @brief 读取约束
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool readConstraint();

        /**
         * @brief 读取 质量 数据结构中暂无，暂未实现
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-07
         */
        bool readMass();

        /**
         * @brief 读取 旋转惯量 数据结构中暂无，暂未实现
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-07
         */
        bool readRotaryInertia();

        /**
         * @brief 读取 局部坐标系 Transform 和 Orientation
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool readTransformOrientation();

        /**
         * @brief 读取Element
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-29
         */
        bool readElement();

        /**
         * @brief 读取惯性特征
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        bool readInertia();

        /**
         * @brief 读取弹簧特征
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-22
         */
        bool readSpringDashpot();

        /**
         * @brief 读取连接器截面
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-24
         */
        bool readConnectorSection();

        /**
         * @brief 写出实例
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool writeInstance();

        /**
         * @brief 写出点
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool writeNode();

        /**
         * @brief 写出集合和表面
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-27
         */
        bool writeSetSurf();

        /**
         * @brief 写出set 包含点集、单元集
         * @param set set数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool writeSet(Interface::FITKModelSet* set);

        /**
         * @brief 写出surface
         * @param surface surface数据
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-27
         */
        bool writeSurface(Interface::FITKMeshSurface* surface);

        /**
         * @brief 写出约束
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-19
         */
        bool writeConstraint();

        /**
         * @brief 写出 局部坐标系
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool writeTransformOrientation();

        /**
         * @brief 写出惯量
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        bool writeInertia();

        /**
         * @brief 写出弹簧特征
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-22
         */
        bool writeSpringDashpot();

        /**
         * @brief 写出连接器截面
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-24
         */
        bool writeConnectorSection();

        /**
         * @brief 判断值是否为0
         * @param d 数据
         * @param size 数组长度
         * @return true 含有非零值 false 都为零
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool JudgeZero(double* d,int size);

        /**
         * @brief 检查参考点，将全部的ass points转化为参考点
         * @author libaojun(libaojunqd@foxmail.com) 
         * @date 2024-07-19
         */
        void checkAssRefpoints();


    private:
        /**
        * @brief 算例数据
        * @author fulipeng (fulipengqd@yeah.net)
        * @date 2024-03-19
        */
        AbaqusData::FITKDataCase* _caseData{};

        /**
        * @brief 装配（Assembly）数据
        * @author fulipeng (fulipengqd@yeah.net)
        * @date 2024-03-15
        */
        Interface::FITKAbaAssembly* _assemblyData{};

        /**
         * @brief 写出element编号标记用于累加
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-30
         */
        int _writeElementId{ 0 };
    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaAssembly, FITKAbaqusAdaptorAssembly)
}

#endif